import sys
from PySide6.QtGui import QColor, QBrush, QPen
from PySide6.QtWidgets import QApplication, QMainWindow, QGraphicsScene, QGraphicsView, QGraphicsRectItem, QGraphicsEllipseItem, QGraphicsLineItem, QSplitter
from PySide6.QtOpenGLWidgets import QOpenGLWidget
from PySide6.QtCore import Qt, QTime, QTimer
import random
from OpenGL.GL import *


class OpenGLWidget2(QOpenGLWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

    def initializeGL(self):
        # 初始化 OpenGL 状态
        self.paintGL()

    def resizeGL(self, w, h):
        # 设置视口
        glViewport(0, 0, w, h)

    def paintGL(self):
        # 清除背景
        glClearColor(1.0, 1.0, 1.0, 1.0)  # 设置背景色为白色
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

        # 这里可以添加 OpenGL 绘制代码

class 普通图形视图(QGraphicsView):
    def __init__(self, parent=None):
        super().__init__(parent)

    def paintEvent(self, event):
        开始时间 = QTime.currentTime()
        super().paintEvent(event)
        结束时间 = QTime.currentTime()
        时间差 = 开始时间.msecsTo(结束时间)
        print(f"    普通视图渲染时间: {时间差} 毫秒")

class 自定义图形视图(QGraphicsView):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setViewport(QOpenGLWidget())  # 使用自定义的 OpenGLWidget

    def paintEvent(self, event):
        开始时间 = QTime.currentTime()
        super().paintEvent(event)
        结束时间 = QTime.currentTime()
        时间差 = 开始时间.msecsTo(结束时间)
        print(f"OpenGL 视图渲染时间: {时间差} 毫秒")

class 主窗口(QMainWindow):
    def __init__(self):
        super().__init__()

        # 创建 OpenGL 渲染部件
        # self.opengl_widget = OpenGLWidget2(self)
        # self.setCentralWidget(self.opengl_widget)  # 设置为中心部件

        # 创建两个图形视图
        self.视图1 = 普通图形视图(self)
        self.视图2 = 自定义图形视图(self)
        # 创建场景
        self.场景 = QGraphicsScene(self)
        self.场景.setSceneRect(0, 0, 800, 600)  # 设置场景大小
        self.视图1.setScene(self.场景)
        self.视图2.setScene(self.场景)
        # 设置布局
        self.splitter = QSplitter(self)
        self.splitter.addWidget(self.视图1)
        self.splitter.addWidget(self.视图2)
        self.setCentralWidget(self.splitter)

        # 添加大量图形项到场景中
        self.添加图形项()
        # 初始化定时器
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.更新图形项位置)
        self.timer.start(30)  # 每 30 毫秒更新一次

    def 添加图形项(self):
        # 添加10000个图形项
        for _ in range(10000):
            x = random.randint(0, 800)
            y = random.randint(0, 600)
            w = random.randint(50, 100)
            h = random.randint(50, 100)
            项类型 = random.choice([QGraphicsRectItem, QGraphicsEllipseItem, QGraphicsLineItem])
            item = 项类型(x, y, w, h) if 项类型 != QGraphicsLineItem else 项类型(x, y, x + w, y + h)
            self.设置颜色(item)
            item.dx = random.choice([-2, -1, 1, 2])
            item.dy = random.choice([-2, -1, 1, 2])
            self.场景.addItem(item)

    def 设置颜色(self, item):
        随机颜色 = QColor(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
        if isinstance(item, QGraphicsLineItem):
            item.setPen(QPen(随机颜色))
        else:
            item.setBrush(QBrush(随机颜色))

    def 更新图形项位置(self):
        for item in self.场景.items():
            item.setPos(item.x() + item.dx, item.y() + item.dy)
            if item.x() < 0 or item.x() + item.boundingRect().width() > 800:
                item.dx = -item.dx
            if item.y() < 0 or item.y() + item.boundingRect().height() > 600:
                item.dy = -item.dy

if __name__ == '__main__':
    app = QApplication(sys.argv)
    主窗体 = 主窗口()
    主窗体.show()
    sys.exit(app.exec())
